spacepaste

  1.  
  2. #include <stdio.h>
  3. #define SHIFT(x) (x < 0 ? 0 : (1 << x))
  4. #define SHIFT7(BIT, ...) SHIFT(BIT)
  5. #define SHIFT6(BIT, ...) SHIFT(BIT) | SHIFT7(__VA_ARGS__, -1)
  6. #define SHIFT5(BIT, ...) SHIFT(BIT) | SHIFT6(__VA_ARGS__, -1)
  7. #define SHIFT4(BIT, ...) SHIFT(BIT) | SHIFT5(__VA_ARGS__, -1)
  8. #define SHIFT3(BIT, ...) SHIFT(BIT) | SHIFT4(__VA_ARGS__, -1)
  9. #define SHIFT2(BIT, ...) SHIFT(BIT) | SHIFT3(__VA_ARGS__, -1)
  10. #define SHIFT1(BIT, ...) SHIFT(BIT) | SHIFT2(__VA_ARGS__, -1)
  11. #define SHIFT0(BIT, ...) SHIFT(BIT) | SHIFT1(__VA_ARGS__, -1)
  12. #define MASK(...) (SHIFT0(__VA_ARGS__))
  13. #define SET_BITS(TARGET, ...) (TARGET |= MASK(__VA_ARGS__))
  14. #define SET_BIT(TARGET, BIT) (TARGET |= SHIFT(BIT))
  15. #define CLEAR_BITS(TARGET, ...) (TARGET &= ~MASK(__VA_ARGS__)))
  16. #define CLEAR_BIT(TARGET, BIT) (TARGET &= ~SHIFT(BIT))
  17. #define GET_BITS(SOURCE, ...) (SOURCE & MASK(__VA_ARGS__))
  18. #define GET_BIT(SOURCE, BIT) (SOURCE & SHIFT(BIT))
  19. int main () {
  20. unsigned char PORTA = 0;
  21. SET_BIT (PORTA, 1);
  22. printf ("PORTA is now %d\n", PORTA);
  23. SET_BITS (PORTA, 2, 7);
  24. printf ("PORTA is now %d\n", PORTA);
  25. CLEAR_BIT (PORTA, 2);
  26. printf ("PORTA is now %d\n", PORTA);
  27. CLEAR_BITS (PORTA, 1, 7);
  28. SET_BIT (PORTA, 0);
  29. printf ("PORTA is now %d\n", PORTA);
  30. return 0;
  31. }
  32.